<?php
/**
 * 项目主配置文件
 * 支持非根目录部署的导航系统配置
 */

// 引入路由配置
require_once __DIR__ . '/routes.php';

// 基础路径配置
// 如果部署在根目录，设置为 '/'
// 如果部署在子目录，如 '/nav/'，则设置为 '/nav/'
define('BASE_URL', '/');

// 获取基础路径（去掉最后的斜杠用于文件路径）
// 优先使用项目根目录，兼容命令行和Web环境
if (isset($_SERVER['DOCUMENT_ROOT']) && !empty($_SERVER['DOCUMENT_ROOT'])) {
    define('BASE_PATH', rtrim($_SERVER['DOCUMENT_ROOT'] . BASE_URL, '/'));
} else {
    // 命令行环境或DOCUMENT_ROOT不可用时，使用项目根目录
    define('BASE_PATH', dirname(__DIR__));
}

// 当前服务器协议
$protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://';
$httpHost = $_SERVER['HTTP_HOST'] ?? 'localhost';
define('SITE_URL', $protocol . $httpHost . BASE_URL);

// 管理员账号配置
define('ADMIN_USERNAME', 'ilovefree');
define('ADMIN_PASSWORD', 'Rede_1029');

// 网站基本信息
define('SITE_TITLE', '精美导航');
define('SITE_DESCRIPTION', 'Apple风格的精美导航系统');
define('SITE_KEYWORDS', '导航,网址导航,Apple风格,毛玻璃');

// 数据存储配置
define('DATA_DIR', BASE_PATH . '/data');
define('UPLOAD_DIR', BASE_PATH . '/uploads');
define('ICON_DIR', UPLOAD_DIR . '/icons');

// 创建必要目录
$directories = [DATA_DIR, UPLOAD_DIR, ICON_DIR];
foreach ($directories as $dir) {
    if (!is_dir($dir)) {
        mkdir($dir, 0755, true);
    }
}

// 调试配置
define('DEBUG_MODE', false);

// 时区设置
date_default_timezone_set('Asia/Shanghai');

// 错误报告设置
if (DEBUG_MODE) {
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
} else {
    error_reporting(0);
    ini_set('display_errors', 0);
}

// 统一会话管理系统
function initSession() {
    // 防止重复初始化
    if (session_status() !== PHP_SESSION_NONE) {
        return;
    }

    try {
        // 配置session参数
        ini_set('session.cookie_httponly', 1);
        ini_set('session.use_strict_mode', 1);
        ini_set('session.cookie_samesite', 'Lax');
        ini_set('session.use_cookies', 1);
        ini_set('session.use_only_cookies', 1);

        // 设置session生命周期（24小时）
        ini_set('session.gc_maxlifetime', 86400);
        ini_set('session.cookie_lifetime', 86400);

        // 配置垃圾回收概率（1/100）
        ini_set('session.gc_probability', 1);
        ini_set('session.gc_divisor', 100);

        // 自定义session保存路径，确保权限正确
        $sessionPath = DATA_DIR . '/sessions';
        if (!is_dir($sessionPath)) {
            mkdir($sessionPath, 0755, true);
        }

        // 检查session目录权限
        if (!is_writable($sessionPath)) {
            error_log("Session directory is not writable: $sessionPath");
            // 回退到系统默认路径
            $sessionPath = sys_get_temp_dir() . '/php_sessions';
            if (!is_dir($sessionPath)) {
                mkdir($sessionPath, 0755, true);
            }
        }

        session_save_path($sessionPath);

        // 设置session名称，避免与其他应用冲突
        session_name('ADMIN_SESSION');

        // 启动session
        if (!session_start()) {
            throw new Exception("Failed to start session");
        }

        // 验证session完整性
        if (!validateSessionIntegrity()) {
            writeLog("检测到session完整性问题，重新生成session", 'WARNING');
            session_regenerate_id(true);
        }

        writeLog("Session初始化成功，Session ID: " . session_id());
        return true;

    } catch (Exception $e) {
        error_log("Session initialization failed: " . $e->getMessage());
        writeLog("Session初始化失败: " . $e->getMessage(), 'ERROR');
        return false;
    }
}

/**
 * 验证session完整性
 */
function validateSessionIntegrity() {
    // 检查必要的session变量是否存在
    if (isset($_SESSION['admin_logged_in']) && $_SESSION['admin_logged_in'] === true) {
        // 检查登录时间是否合理
        $loginTime = $_SESSION['login_time'] ?? 0;
        $currentTime = time();

        // 如果登录时间超过24小时，认为session过期
        if ($currentTime - $loginTime > 86400) {
            writeLog("Session已过期，需要重新登录", 'INFO');
            // 清除过期的session数据
            unset($_SESSION['admin_logged_in']);
            unset($_SESSION['admin_username']);
            unset($_SESSION['login_time']);
            return false;
        }

        // 检查最后活动时间
        $lastActivity = $_SESSION['last_activity'] ?? $loginTime;
        if ($currentTime - $lastActivity > 3600) { // 1小时无活动
            writeLog("用户长时间无活动，更新活动时间", 'INFO');
            $_SESSION['last_activity'] = $currentTime;
        }

        // 检查IP地址变化（可选的安全措施）
        if (isset($_SESSION['login_ip']) && $_SESSION['login_ip'] !== getClientIP()) {
            writeLog("检测到IP地址变化，可能存在安全风险。原IP: {$_SESSION['login_ip']}, 当前IP: " . getClientIP(), 'WARNING');
            // 不强制登出，只记录警告，因为IP地址可能会变化（如移动网络）
        }

        // 检查用户代理变化
        if (isset($_SESSION['user_agent']) && $_SESSION['user_agent'] !== ($_SERVER['HTTP_USER_AGENT'] ?? '')) {
            writeLog("检测到用户代理变化，可能存在安全风险", 'ERROR');
            // 清除session数据，强制重新登录
            unset($_SESSION['admin_logged_in']);
            unset($_SESSION['admin_username']);
            unset($_SESSION['login_time']);
            return false;
        }
    }

    return true;
}

/**
 * 安全地重新生成session ID
 */
function regenerateSession() {
    if (session_status() !== PHP_SESSION_NONE) {
        session_regenerate_id(true);

        // 更新session中的关键信息
        if (isset($_SESSION['admin_logged_in'])) {
            $_SESSION['last_activity'] = time();
        }
    }
}

// 初始化session - 对所有PHP页面和管理后台请求初始化，避免影响静态文件
// 检查请求是否为静态资源
$requestUri = $_SERVER['REQUEST_URI'] ?? '';
$scriptName = $_SERVER['SCRIPT_NAME'] ?? '';
$phpSelf = $_SERVER['PHP_SELF'] ?? '';

$staticExtensions = ['css', 'js', 'png', 'jpg', 'jpeg', 'gif', 'ico', 'svg', 'woff', 'woff2', 'ttf', 'eot'];
$isStaticResource = false;

// 检查请求URI是否包含静态资源扩展名
foreach ($staticExtensions as $ext) {
    if (strpos($requestUri, '.' . $ext) !== false) {
        $isStaticResource = true;
        break;
    }
}

// 检查脚本文件名是否为静态资源
foreach ($staticExtensions as $ext) {
    if (strpos($scriptName, '.' . $ext) !== false || strpos($phpSelf, '.' . $ext) !== false) {
        $isStaticResource = true;
        break;
    }
}

// 强制为admin目录下的所有请求初始化session
$isAdminRequest = (strpos($requestUri, '/admin') !== false ||
                   strpos($scriptName, '/admin') !== false ||
                   strpos($phpSelf, '/admin') !== false);

// 对非静态资源或admin请求启动session
if (!$isStaticResource || $isAdminRequest) {
    initSession();
}

/**
 * 获取完整URL
 * @param string $path 相对路径
 * @return string 完整URL
 */
function getUrl($path = '') {
    // 移除.php后缀
    if (substr($path, -4) === '.php') {
        $path = substr($path, 0, -4);
    }
    return SITE_URL . ltrim($path, '/');
}

/**
 * 获取资源URL
 * @param string $path 资源路径
 * @return string 资源URL
 */
function asset($path) {
    return getUrl('assets/' . ltrim($path, '/'));
}

/**
 * 调试输出
 * @param mixed $data 要输出的数据
 * @param bool $exit 是否退出
 */
function debug($data, $exit = false) {
    if (DEBUG_MODE) {
        echo '<pre>';
        print_r($data);
        echo '</pre>';
        if ($exit) exit;
    }
}

/**
 * 日志记录
 * @param string $message 日志消息
 * @param string $level 日志级别
 */
function writeLog($message, $level = 'INFO') {
    if (DEBUG_MODE) {
        $timestamp = date('Y-m-d H:i:s');
        $logMessage = "[$timestamp][$level] $message" . PHP_EOL;
        file_put_contents(DATA_DIR . '/debug.log', $logMessage, FILE_APPEND | LOCK_EX);
    }
}

/**
 * 获取客户端IP
 * @return string IP地址
 */
function getClientIP() {
    $ipKeys = ['HTTP_X_FORWARDED_FOR', 'HTTP_X_REAL_IP', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'];
    foreach ($ipKeys as $key) {
        if (!empty($_SERVER[$key])) {
            $ips = explode(',', $_SERVER[$key]);
            return trim($ips[0]);
        }
    }
    return 'unknown';
}

/**
 * 安全过滤输入
 * @param string $input 输入数据
 * @return string 过滤后的数据
 */
function sanitizeInput($input) {
    return htmlspecialchars(trim($input), ENT_QUOTES, 'UTF-8');
}

/**
 * 安全处理脚本代码（不过滤HTML标签）
 * @param string $input 脚本代码
 * @return string 处理后的脚本代码
 */
function sanitizeScriptCode($input) {
    // 只去除首尾空白字符，保留HTML标签和脚本代码
    return trim($input);
}

/**
 * JSON响应
 * @param bool $success 是否成功
 * @param string $message 响应消息
 * @param mixed $data 响应数据
 */
function jsonResponse($success, $message, $data = null) {
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode([
        'success' => $success,
        'message' => $message,
        'data' => $data,
        'timestamp' => time()
    ], JSON_UNESCAPED_UNICODE);
    exit;
}



/**
 * 全局访问统计逻辑
 * 自动判断并统计页面访问量，排除管理后台页面
 */
function autoTrackPageVisit() {
    // 检查是否已经执行过统计，避免重复统计
    if (defined('VISIT_TRACKED')) {
        writeLog("检测到重复调用 autoTrackPageVisit，已跳过");
        return;
    }
    define('VISIT_TRACKED', true);
    
    try {
        // 获取请求URI和脚本路径
        $requestUri = $_SERVER['REQUEST_URI'] ?? '/';
        $scriptName = $_SERVER['SCRIPT_NAME'] ?? '';
        $phpSelf = $_SERVER['PHP_SELF'] ?? '';
        $documentRoot = $_SERVER['DOCUMENT_ROOT'] ?? '';
        $scriptFilename = $_SERVER['SCRIPT_FILENAME'] ?? '';
        
        writeLog("=== 增强版全局访问统计检查 ===");
        writeLog("请求URI: " . $requestUri);
        writeLog("脚本名称: " . $scriptName);
        writeLog("PHP_SELF: " . $phpSelf);
        writeLog("脚本文件名: " . $scriptFilename);
        writeLog("当前文件: " . __FILE__);
        
        // 详细检测每个判断条件
        $detectionResults = [
            'requestUri_admin' => strpos($requestUri, '/admin') !== false,
            'requestUri_admin_slash' => strpos($requestUri, 'admin/') !== false,
            'scriptName_admin' => strpos($scriptName, '/admin/') !== false,
            'scriptName_admin_slash' => strpos($scriptName, 'admin/') !== false,
            'phpSelf_admin' => strpos($phpSelf, '/admin/') !== false,
            'phpSelf_admin_slash' => strpos($phpSelf, 'admin/') !== false,
            'scriptFilename_admin' => strpos($scriptFilename, '/admin/') !== false,
            'basename_admin' => strpos(basename($scriptFilename), 'admin') !== false,
            'currentFile_admin' => strpos(__FILE__, '/admin/') !== false,
            'includeStack_admin' => checkAdminInIncludeStack(),
            'backtrace_admin' => checkBacktraceForAdmin()
        ];
        
        writeLog("检测结果详情: " . json_encode($detectionResults));
        
        // 增强的管理后台判断逻辑 - 适配多种环境
        $isAdminPage = (
            $detectionResults['requestUri_admin'] ||
            $detectionResults['requestUri_admin_slash'] ||
            $detectionResults['scriptName_admin'] ||
            $detectionResults['scriptName_admin_slash'] ||
            $detectionResults['phpSelf_admin'] ||
            $detectionResults['phpSelf_admin_slash'] ||
            $detectionResults['scriptFilename_admin'] ||
            $detectionResults['basename_admin'] ||
            $detectionResults['currentFile_admin'] ||
            $detectionResults['includeStack_admin'] ||
            $detectionResults['backtrace_admin']
        );
        
        // 判断是否为API请求
        $isApiRequest = (
            strpos($requestUri, '/api/') !== false ||
            strpos($scriptName, '/api/') !== false ||
            strpos($phpSelf, '/api/') !== false
        );
        
        // 判断是否为静态资源请求
        $staticExtensions = ['.css', '.js', '.ico', '.png', '.jpg', '.jpeg', '.gif', '.svg', '.woff', '.woff2', '.ttf', '.eot'];
        $isStaticResource = false;
        foreach ($staticExtensions as $ext) {
            if (strpos($requestUri, $ext) !== false) {
                $isStaticResource = true;
                break;
            }
        }
        
        writeLog("是否管理后台: " . ($isAdminPage ? '是' : '否'));
        writeLog("是否API请求: " . ($isApiRequest ? '是' : '否'));
        writeLog("是否静态资源请求: " . ($isStaticResource ? '是' : '否'));
        
        // 输出调用栈信息
        $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5);
        writeLog("调用栈信息:");
        foreach ($backtrace as $i => $trace) {
            $file = $trace['file'] ?? 'unknown';
            $line = $trace['line'] ?? 'unknown';
            $function = $trace['function'] ?? 'unknown';
            writeLog("  [$i] $file:$line -> $function()");
        }
        
        // 只有前台页面访问才统计
        if (!$isAdminPage && !$isApiRequest && !$isStaticResource) {
            require_once __DIR__ . '/../includes/database.php';
            $db = new Database();
            $result = $db->incrementVisits();
            writeLog("前台访问统计结果: " . ($result ? '成功' : '失败'));
        } else {
            writeLog("跳过访问统计 (管理后台或API请求或静态资源请求)");
        }
        writeLog("=== 增强版全局访问统计结束 ===");
        
    } catch (Exception $e) {
        writeLog("全局访问统计错误: " . $e->getMessage(), 'ERROR');
    }
}

/**
 * 检查包含栈中是否有admin相关文件
 */
function checkAdminInIncludeStack() {
    $includedFiles = get_included_files();
    foreach ($includedFiles as $file) {
        if (strpos($file, '/admin/') !== false || strpos(basename($file), 'admin') !== false) {
            return true;
        }
    }
    return false;
}

/**
 * 检查调用栈中的文件路径
 */
function checkBacktraceForAdmin() {
    $backtrace = debug_backtrace();
    foreach ($backtrace as $trace) {
        if (isset($trace['file']) && strpos($trace['file'], '/admin/') !== false) {
            return true;
        }
    }
    return false;
}

// 自动执行访问统计已禁用 - 改为由前端JavaScript统一处理，避免重复统计
// if (isset($_SERVER['REQUEST_METHOD']) && !defined('DISABLE_AUTO_TRACK')) {
//     autoTrackPageVisit();
// }